3458
331
Ich habe eine Liste von Zeiten in Sekunden wie:
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
Für jedes Fenster mit einer Länge von 2 Sekunden, beginnend an einer zweiten Grenze, möchte ich eine Liste aller Zeiten ausgeben, die in das 2-Sekunden-Fenster fallen. Für das obige Beispiel wäre es also:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Im Allgemeinen kann die Fensterlänge von 2 abweichen.
Wie kannst du das tun? 
Ich denke, Sie meinten Inkrement basierend auf "Für jedes Fenster mit einer Länge von 2 Sekunden ab einer zweiten Grenze" und nicht Überlappung. Für zwei Sekundenintervalle ist es dasselbe, aber da Sie die Länge variieren möchten, wäre eine Überlappung von einer Sekunde 0-3, 2-5, 4-7, aber ein Inkrement würde 0-3, 1-4, 2- bedeuten 5. Es war jedoch interessant, für beide Fälle Lösungen für beide zu finden.
Angenommen, L ist sortiert und alle Elemente sind positiv und die zweiten Intervalle beginnen alle mit ganzen Zahlen, können wir diese Methode verwenden:
Mathe importieren
aus Sammlungen importieren defaultdict
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (Liste)
Intervallbreite = 2
für x in L:
Upper_bound = math.ceil (x)
Lower_bound = Upper_bound - Intervallbreite
lower_bound = max (0, lower_bound)
für y im Bereich (untere_Bindung, obere_Bindung):
my_ranges [y] .append (x)
für ein in sortiert (my_ranges):
print (my_ranges [a])
Ich weiß nicht, ob Sie sehen wollen, ob es leere Bereiche gibt. Das defaultdict druckt aber auch leere Bereiche aus, wenn Sie möchten. Verwenden Sie diese Zeile anstelle von "für eine Sortierung":
für a in range (min (my_ranges), max (my_ranges) + 1):
Wenn Sie die Bereiche 0-3, 2-5, 4-7 wollten, funktioniert dies:
Mathe importieren
aus Sammlungen importieren defaultdict
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
Intervallbreite = 2
my_ranges_2 = defaultdict (Liste)
für x in L:
definitiv_in = (x // (Intervallbreite - 1)) * (Intervallbreite - 1) # Das niedrigste Vielfache der Intervallbreite unter x ist immer in
#print ("Hinzufügen", x, "zu", definitiv_in)
my_ranges_2 [definitiv_in] .append (x)
Wenn x  = 0: # ist, wenn x 2,3 ist und wir 0,3 2,5 usw. haben ... müssen wir diesen doppelten Fall abfangen. Ich gehe davon aus, dass die Fensterlängen ganze Zahlen sind, und wenn nicht, haben wir viel mehr zu tun, da die Zahl in mehr als einem Array liegen kann. Vielleicht könnten wir eine while-Schleife haben, die um (interval_width - 1) erhöht wird.
#print ("++ Hinzufügen", x, "zu", definitiv_in - Intervallbreite + 1)
my_ranges_2 [definitiv_in - Intervallbreite + 1] .append (x)
für ein in sortiert (my_ranges_2):
print (a, my_ranges_2 [a])
# print (my_ranges_2 [a])
Ich vermute, dass ich einige Details vergessen habe, aber hoffentlich können Sie intervall_width nach Bedarf ändern, um sicherzustellen, dass mein Code das tut, was Sie sich erhofft haben, und mich wissen lassen, was genau Sie benötigen.
|
Eine mögliche Lösung, die ich vorschlagen kann, ist in gewissem Sinne "effizient", da sie die Eingabedaten nur einmal durchläuft und keine Abhängigkeiten aufweist. Die Kosten sind natürlich, dass es in reinem Python geschrieben ist (möglicherweise gibt es optimierten Code) und dass es mehr Tracking-Variablen einführt, um eine Wiederholung zu verhindern (und daher weniger pythonisch ist).
def sliding_window (Daten, Dauer, Start = 0, Überlappung = 1):
Ergebnis = []
data_idx = 0
result_idx = 0
obere = Start + Dauer
niedriger = Start
next_lower = obere Überlappung
# innerer Helfer zum Auffüllen leerer innerer Listen bis zu unserem Einfügepunkt und Einfügen
def pad_and_append (at):
während len (Ergebnis) <= at:
result.append ([])
Ergebnis [at] .append (Daten [data_idx])
# durch Eingabedaten iterieren
während data_idx  a:
wenn x  = l [0]) & (L  = i) & (L